(function(factory) {
	if (typeof define === "function" && define.amd) {
		// AMD. Register as an anonymous module.
		define(['HteOS/dock/Dock'], factory);
	} else {
		// Browser globals
		factory();
	}
}(function() {
	/**
	 * <p>HteOS中的应用类，应用是用户或者系统从应用市场中安装的。</p>
	 * <p>在应用中定义了应用的尺寸，UI等磁贴相关的属性</p>
	 * @class HteOS.app.App 
	 */
	var App = HteOS.app.App = function(options) {
		HteOS.apply(this,options);
		//点击执行脚本
		if (options.click == 'execute' && options.script) {
			try {
				this.handler = new Function(options.script);
			} catch (e) {
				
			}
		}
		
		HteOS.app.AppManager.register(this);
	};
	
	/**
    * 应用的ID
    * @property
    * @type {String}
    * */
   App.prototype.id = "";
	
	
	/** 默认名称颜色
	 *@cfg
	 *@type {String}
	 */
   App.prototype.color = "#000";
   
   /**
    * 应用是否隐藏 {Boolean} FALSE、不隐藏 TUR、隐藏
    * @type {Boolean}
    * @cfg
    * */
   App.prototype.hidden = false;
   
   
   /**
    * 应用是否系统App {Boolean} FALSE 不是系统APP TRUE 是系统APP ，系统APP无法卸载
     * @type {Boolean}
    * @cfg
    * */
   App.prototype.native = false;
   
   /**
    * 磁贴样式 1、显示图标 2、显示背景图片，目前只支持这两种样式
    * @type {String}
    * @cfg
    * */
   App.prototype.ui = "1";
   
   /**
    * 磁贴悬浮显示的文字，暂时无法使用
    * @deprecated
    * @cfg
    * */
   App.prototype.caption = "";
   
   
   /**
    * 定义了点击磁贴后的执行动作 
    * <ul>
    * 	<li>open:加载资源</li>
    * 	<li>execute:执行脚本</li>
    * </ul>
    * @cfg
    * */
   App.prototype.click = "open";
   
   /**
    * 磁贴背景颜色
    * @type {String}
    * @cfg
    * */
   App.prototype.bgcolor = "rgba(31, 83, 160)";
   
   /**
    * 应用特殊处理标记，用于定义动态磁贴的类
    * @type {String}
    * @cfg
    * */
   App.prototype.toggle = "";
   
   /**
    * 应用名称
    * @type {String}
    * @cfg
    * */
   App.prototype.name = "";
   
   /**
    * 磁贴的尺寸，两种尺寸： 
    * @type {String}
    * <ul>
    * 	<li>mini:小尺寸</li>
    * 	<li>default:大尺寸</li>
    * </ul>
    * @cfg
    * */
   App.prototype.size = "mini";
   
   
   /**
    * 定义加载的资源的URL
    * @type {String}
    * @cfg
    * */
   App.prototype.path = "";
   
   /**
    * 定义执行的脚本
    * @type {String}
    * @cfg
    * */
   App.prototype.script = "";
   
   /**
    * 应用在当前应用组中的位置
    * @type {Number}
    * @property
    * */
   App.prototype.index = 0;
   
   /**
    * 磁贴的背景图片
    * @type {String}
    * @cfg
    * */
   App.prototype.image = "";
   
   /**
    * 磁贴中文字的颜色
    * @type {String}
    * @cfg
    * */
   App.prototype.color = "#fff";
   
   
   /**
    * 应用的图标图片
    * @type {String}
    * @cfg
    * */
   App.prototype.icon = "";
   
   /**
    * 应用代码
    * @type {String}
    * @cfg
    * */
   App.prototype.code = "";
   
   /**定义应用加载资源的模式
    * <ul>
    * 	<li>window:窗口模式</li>
    * 	<li>dock:侧边栏模式</li>
    * </ul>
    * @type {String}
    * @cfg
    * */
   App.prototype.mode = "window";
   
   
   /**定义应用窗口是否可以最大化
    * @type {Boolean}
    * @cfg
    * */
   App.prototype.maximizable = true;
   
   /**定义应用窗口是否支持拖拽改变大小
    * @type {Boolean}
    * @cfg
    * */
   App.prototype.resizable = true;

   /**定义应用窗口初始宽度
    * @type {Number}
    * @cfg
    * */
   App.prototype.width = 900;
   
   /**定义应用窗口初始高度
    * @type {Number}
    * @cfg
    * */
   App.prototype.height = 500;
   
    /**定义应用渲染模式
    * <ul>
    * 	<li>plain:直接渲染</li>
    * 	<li>template:使用模板渲染</li>
    * </ul>    
    * @type {String}
    * @cfg
    * */
   App.prototype.renderer = "plain";
   
   /**应用是否固定在快速启动栏
    * @type {Boolean}
    * @cfg
    * */
   App.prototype.pinked = false;
   
	/**
	 * 设置应用对应的磁贴位置，
	 */
	App.prototype.position = function(pos) {
		this.getEl().css(pos);
	};
	
	/**
	 *设置应用的尺寸，这个方法里面会对磁贴进行重新渲染，并且重启动态磁贴对象
	 * 设置成功后触发应用调整大小事件
	 * @param {String} size
	 */
	App.prototype.setSize = function(size){
		if(this.size == size){
			return;
		}
		this.size = size;
		/**
		 *@event hte-app-resize 应用发生调整大小事件
		 * @param {HteOS.app.App} app 调整大小的应用
		 */
		HteOS.EventManager.trigger("hte.app.resize",this,this.size);
	};

	
	/**
	 * @private
	 * 移动到分组,如果新的分组不是老的分组,则触发事件
	 * 这个方法是在HteOS.app.Group.insert的时候反向调用的，单独调用不用移动到其他的分组当中
	 */
	App.prototype.moveTo = function(group){
		var oldGroup = this.group;
		this.group = group;
		if(oldGroup.initialized === true ){
			oldGroup.remove(this);
			if(oldGroup != group){
				/**
				 * @event hte-app-move 触发应用移动分组事件
				 * @param {HteOS.app.App} app 
				 * @param {HteOS.app.Group} oldGroup
				 * @param {HteOS.app.Group} newGroup
				 */
				HteOS.EventManager.trigger("hte-app-move",this,oldGroup,group);
			}
		}
	};
	
	
	/**
	 * 获取应用所属的分组
	 * @return {HteOS.app.Group} group 
	 */
	App.prototype.getGroup = function(){
		return this.group;
	}

	/**
	 *获取app在分组中的位置
	 * @return {Number} index
	 */
	App.prototype.indexOf = function(){
		return this.group.indexOf(this);
	}
	/**
	 * 卸载应用，在卸载之前首先将动态磁贴的实例销毁，移除DOM对象
	 * 并触发hte.app.uninstall事件，然后在应用管理器中注销应用
	 */
	App.prototype.uninstall = function() {
		/***
		 * @event hte-app-uninstall
		 * @param {HteOS.app.App} app
		 * */
		this.group.remove(this);
		/**
		 * 应用卸载时触发卸载事件
		 * @event hte-app-uninstall
		 * @param {HteOS.app.App} app
		 * */
		HteOS.EventManager.trigger("hte.app.uninstall",this);
		//FIXME 添加事件
		HteOS.app.AppManager.unregister(this);
	};

	App.prototype.getWindow = function() {
		return HteOS.TaskManager.getShell(this.id);
	};
	
	/**
	 * 将隐藏的应用对应的磁贴显示出来
	 * */
	App.prototype.show = function(){
		this.hidden = false;
		/***
		 * 磁贴显示的事件
		 * @event hte-tile-show
		 * @param {HteOS.app.App} app
		 * */
		HteOS.EventManager.trigger("hte.app.show",this);
	};
	
	/**
	 * 隐藏应用对应的磁贴
	 * */
	App.prototype.hide = function(){
		this.hidden = true;
		/***
		 * 磁贴隐藏的事件
		 * @event hte-tile-hide
		 * @param {HteOS.app.App} app
		 * */
		HteOS.EventManager.trigger("hte.app.hide",this);
	};
	
	/**
 	 * 将应用固定到快速启动栏
	 * */
	App.prototype.pink = function(){
		this.quick = true;
		/***
		 * 应用添加到快速启动栏之后触发
		 * @event hte-app-pink
		 * @param {HteOS.app.App} app
		 * */
		HteOS.EventManager.trigger("hte.app.pink",this);
	};
	
	/**
	 * 取消固定到快速启动栏
	 * */
	App.prototype.unpink = function(){
		this.quick = false;
		/***
		 * 应用从快速启动栏移出之后触发
		 * @event hte-app-unpink
		 * @param {HteOS.app.App} app
		 * */
		HteOS.EventManager.trigger("hte.app.unpink",this);
	};
	
	/**
	 * @deprecated
	 * @see {HteOS.app.App.pink}
	 * 将应用添加到快速启动栏
	 * 取消事件 @event hte-app-set-quick
	 * */
	App.prototype.setQuick = App.prototype.pink;
	
	/**
	 * @deprecated
	 * @see {HteOS.app.App.unpink}
	 * 将应用移出快速启动栏
	 * 取消事件 @event hteos-app-clear-quick
	 * */
	App.prototype.clearQuick = App.prototype.unpink;


	return HteOS.app.App;
}));